package handlers

import (
	"fmt"
	"goserver/models"
	"goserver/utils"
	"goserver/verify"
	"net/http"

	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/bson/primitive"
)

type BaseHandler[T any] struct {
	collection *models.BaseRepository[T]
}

// [T any] 是 Go 语言的泛型语法，用于定义一个泛型类型 T。
func NewBaseHandler[T any](repo *models.BaseRepository[T]) *BaseHandler[T] {
	return &BaseHandler[T]{repo} //[T]是类型参数，用于指定具体的类型。
}

// 新增实体
func (h *BaseHandler[T]) AddEntity(w http.ResponseWriter, r *http.Request, entity T, propsName string) {
	// 数据验证
	if err := verify.ValidateStruct(entity); err != nil {
		utils.Response(w, 201, "数据验证错误: "+err.Error(), nil)
		return
	}
	// 插入数据库
	if err := h.collection.Insert(entity, propsName); err != nil {
		utils.Response(w, 201, "数据库错误: "+err.Error(), nil)
		return
	}

	utils.Response(w, 200, "操作成功", nil)
}

// 根据属性查询实体
func (h *BaseHandler[T]) FindOneByPropsEntity(w http.ResponseWriter, r *http.Request, entity T, propName string) (*T, error) {

	data, ok := utils.GetFieldValue(entity, propName) // 假设 keyProps 是 "Name" 或 "ID" 或其他字段名
	if !ok {
		return nil, fmt.Errorf("属性 %s 不存在", propName)
	}

	query := bson.M{propName: data}
	result, err := h.collection.FindOne(query)
	if err != nil {
		return nil, fmt.Errorf("数据库错误: %v", err)
	}
	if result != nil {
		return nil, fmt.Errorf("数据已存在")
	}
	return result, nil // 返回查询结果或 nil，如果未找到匹配项则返回 nil
}

// 根据id查询实体
func (h *BaseHandler[T]) FindByIDEntity(w http.ResponseWriter, r *http.Request, id primitive.ObjectID) (*T, error) {
	result, err := h.collection.FindByID(id)
	if err != nil {
		return nil, fmt.Errorf("数据库错误: %v", err)
	}
	if result == nil {
		return nil, fmt.Errorf("数据不存在")
	}
	return result, nil
}

// 根据id删除实体
func (h *BaseHandler[T]) DeleteEntity(w http.ResponseWriter, r *http.Request, id primitive.ObjectID) error {
	if err := h.collection.DeleteById(id); err != nil {
		return fmt.Errorf("数据库错误: %v", err)
	}
	return nil
}

// 根据id更新实体
func (h *BaseHandler[T]) UpdateEntity(w http.ResponseWriter, r *http.Request, update bson.M, id primitive.ObjectID) error {

	// 检查是否存在数据
	if _, err := h.collection.FindByID(id); err != nil {
		return fmt.Errorf("数据不存在: %v", err)
	}

	if err := h.collection.Update(id, update); err != nil {
		return fmt.Errorf("数据库错误: %v", err)
	}
	return nil
}

// 分页查询实体列表
func (h *BaseHandler[T]) FindListWithPaginationEntity(w http.ResponseWriter, r *http.Request, filter bson.M, page int64, pageSize int64) ([]T, int64, error) {
	results, total, err := h.collection.FindListWithPagination(filter, page, pageSize)
	if err != nil {
		return nil, 0, fmt.Errorf("数据库错误: %v", err)
	}
	return results, total, nil
}
